/// 
/// MaDAson - Toolkit for Model Driven Software Development
/// 
/// Copyright [2006] Marcus Lankenau
/// 
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///  
///     http://www.apache.org/licenses/LICENSE-2.0
///  
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
/// 

using System;
using System.Collections;
using System.Xml.Serialization;
using System.Text;

namespace Madason.MetaModel
{
	public enum ParameterDir
	{
		In,
		Out,
		InOut
	}

	public class Parameter : ModelElement
	{
		private string typeId;
		private Operation operation;
		private ParameterDir dir = ParameterDir.In;

		[XmlAttribute("type")]
		public string TypeId
		{
			get { return typeId; }
			set { typeId = value; }
		}

		public Class ParamType
		{
			get { return Operation.Class.Model.FindClassById(TypeId); }
		}

		public Operation Operation
		{
			get { return operation; }
			set { operation = value; }
		}

		public ParameterDir Dir
		{
			get { return dir; }
			set { dir = value; }
		}


		public Class Type
		{
			get
			{
				return Operation.Class.Model.FindClassById(TypeId);
			}
		}

	}

	#region Helper Types

	public delegate void ParameterAddDelegate(Parameter ns);

	public class ParameterList : ArrayList
	{
		public event ParameterAddDelegate AfterParameterAdded;

		public void Add(Parameter p)
		{
			base.Add(p);
			if (AfterParameterAdded != null)
				AfterParameterAdded(p);
		}

		public Parameter this[int i]
		{
			get
			{
				return base[i] as Parameter;
			}
		}
	}

	#endregion

}
